package br.com.toscano.gobra.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.model.SelectItem;
import javax.inject.Inject;

import br.com.toscano.gobra.business.AgrupamentoItemBC;
import br.com.toscano.gobra.business.DespesaBC;
import br.com.toscano.gobra.business.EstadoBC;
import br.com.toscano.gobra.business.FormaExecucaoBC;
import br.com.toscano.gobra.business.LocalItemBC;
import br.com.toscano.gobra.business.ObraBC;
import br.com.toscano.gobra.business.ProjetoAtividadeBC;
import br.com.toscano.gobra.business.SituacaoObraBC;
import br.com.toscano.gobra.business.TabelaPrecoBC;
import br.com.toscano.gobra.business.TipoARTBC;
import br.com.toscano.gobra.business.TipoObraBC;
import br.com.toscano.gobra.business.TipoPrazoBC;
import br.com.toscano.gobra.business.UnidadeMedidaBC;
import br.com.toscano.gobra.business.UnidadeOrcamentariaBC;
import br.com.toscano.gobra.domain.AgrupamentoItem;
import br.com.toscano.gobra.domain.Despesa;
import br.com.toscano.gobra.domain.Estado;
import br.com.toscano.gobra.domain.ExigenciaTipoObra;
import br.com.toscano.gobra.domain.FormaExecucao;
import br.com.toscano.gobra.domain.ItemTabelaPreco;
import br.com.toscano.gobra.domain.LocalItem;
import br.com.toscano.gobra.domain.Obra;
import br.com.toscano.gobra.domain.ProjetoAtividade;
import br.com.toscano.gobra.domain.SituacaoObra;
import br.com.toscano.gobra.domain.TabelaPreco;
import br.com.toscano.gobra.domain.TipoART;
import br.com.toscano.gobra.domain.TipoObra;
import br.com.toscano.gobra.domain.TipoPrazo;
import br.com.toscano.gobra.domain.UnidadeMedida;
import br.com.toscano.gobra.domain.UnidadeOrcamentaria;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./obra_list.jsf")
public class ObraEditMB extends AbstractEditPageBean<Obra, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private ObraBC obraBC;
	
	private String nomeArquivo;
	private String descricaoArquivo;
	private Integer posicaoDocumento;

	private Integer posicaoItem;
	private BigDecimal quantidade;
	private BigDecimal valorTotalItens;
	private Integer periodoInicialItem;
	private Integer periodoFinalItem;
	private List<SelectItem> periodos;

	private BigDecimal bdiCadastro;
	private BigDecimal bdi;
	private List<SelectItem> bdis;
	
	@Inject
	private UnidadeOrcamentariaBC unidadeOrcamentariaBC;
	private List<SelectItem> unidadeOrcamentarias;
	private Long unidadeOrcamentaria;
	private Long unidadeExecutora;

	@Inject
	private UnidadeMedidaBC unidadeMedidaBC;
	private List<SelectItem> unidadeMedidas;
	private Long unidadeMedida;

	@Inject
	private TipoPrazoBC tipoPrazoBC;
	private List<SelectItem> tipoPrazos;
	private Long tipoPrazo;

	@Inject
	private ProjetoAtividadeBC projetoAtividadeBC;
	private List<SelectItem> projetoAtividades;
	private Long projetoAtividade;

	@Inject
	private DespesaBC despesaBC;
	private List<SelectItem> despesas;
	private Long despesa;

	@Inject
	private FormaExecucaoBC formaExecucaoBC;
	private List<SelectItem> formaExecucaos;
	private Long formaExecucao;

	@Inject
	private TipoARTBC tipoARTBC;
	private List<SelectItem> tipoARTs;
	private Long tipoART;

	@Inject
	private EstadoBC estadoBC;
	private List<SelectItem> estados;
	private String estado;

	@Inject
	private SituacaoObraBC situacaoObraBC;
	private List<SelectItem> situacaoObras;
	private Long situacaoObra;
	
	
	
	@Inject
	private TabelaPrecoBC tabelaPrecoBC;
	private List<SelectItem> tabelaPrecos;
	private Long tabelaPreco;
	
	@Inject
	private TipoObraBC tipoObraBC;
	private List<SelectItem> tipoObras;
	private Long tipoObra;
	
	public Map<ExigenciaTipoObra, Boolean> getCheckMap() {
		return checkMap;
	}

	public void setCheckMap(Map<ExigenciaTipoObra, Boolean> checkMap) {
		this.checkMap = checkMap;
	}

	public List<ExigenciaTipoObra> getExigencias() {
		if (getTipoObra() != null ) {
			exigencias = this.tipoObraBC.load(this.getTipoObra()).getListaExigenciaTipoObra();
		}

	    return exigencias;
	}

	public void setExigencias(List<ExigenciaTipoObra> exigencias) {
		this.exigencias = exigencias;
	}

	private Map<ExigenciaTipoObra,Boolean> checkMap = new HashMap<ExigenciaTipoObra,Boolean>();

	private List<ExigenciaTipoObra> exigencias;

	
	public List<SelectItem> getTipoObras() {
		tipoObras = new ArrayList<SelectItem>();
		List<TipoObra> lista = tipoObraBC.findAll();
		for (TipoObra obj: lista) {
			tipoObras.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return tipoObras;
	}

	public void setTipoObras(List<SelectItem> tipoObras) {
		this.tipoObras = tipoObras;
	}

	public Long getTipoObra() {
		return tipoObra;
	}

	public void setTipoObra(Long tipoObra) {
		this.tipoObra = tipoObra;
	}

	@Inject
	private LocalItemBC localItemBC;
	private List<SelectItem> localItems;
	private Long localItem;

	@Inject
	private AgrupamentoItemBC agrupamentoItemBC;
	private List<SelectItem> agrupamentoItems;
	private Long agrupamentoItem;

	private List<SelectItem> itemTabelaPrecos;
	private Long itemTabelaPreco;
	private String codigoItem;
	
	public String getCodigoItem() {
		return codigoItem;
	}

	public void setCodigoItem(String codigoItem) {
		this.codigoItem = codigoItem;
	}

	@Override
	@Transactional
	public String delete() {
		this.obraBC.delete(getId());
		return getPreviousView();
	}
	
	private void montarObjeto(){
		if(this.getUnidadeExecutora() != null)
			this.getBean().setUnidadeExecutora(this.unidadeOrcamentariaBC.load(this.getUnidadeExecutora()));
		if(this.getUnidadeOrcamentaria() != null)
			this.getBean().setUnidadeOrcamentaria(this.unidadeOrcamentariaBC.load(this.getUnidadeOrcamentaria()));
		if(this.getUnidadeMedida() != null)
			this.getBean().setUnidadeMedida(this.unidadeMedidaBC.load(this.getUnidadeMedida()));
		if(this.getTipoPrazo() != null)
			this.getBean().setTipoPrazoObra(this.tipoPrazoBC.load(this.getTipoPrazo()));
		if(this.getProjetoAtividade() != null)
			this.getBean().setProjetoAtividade(this.projetoAtividadeBC.load(this.getProjetoAtividade()));
		if(this.getDespesa() != null)
			this.getBean().setDespesa(this.despesaBC.load(this.getDespesa()));
		if(this.getFormaExecucao() != null)
			this.getBean().setFormaExecucao(this.formaExecucaoBC.load(this.getFormaExecucao()));
		if(this.getSituacaoObra() != null)
			this.getBean().setSituacaoObra(this.situacaoObraBC.load(this.getSituacaoObra()));
		if(this.getTipoART() != null)
			this.getBean().setTipoArt(this.tipoARTBC.load(this.getTipoART()));
		if(this.getEstado() != null)
			this.getBean().setUfEngenheiro(this.estadoBC.load(this.getEstado()));
	}
	
	@Override
	@Transactional
	public String insert() {
		montarObjeto();
		getBean().setDataCadastro(new Date());
		this.obraBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montarObjeto();
		this.obraBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Obra handleLoad(Long id) {
		setBean(this.obraBC.load(id));

		checkMap = new HashMap<ExigenciaTipoObra,Boolean>();
		
		if (this.getTipoObra() != null ) {
			
			exigencias = getExigencias();
			
			if(this.getBean() != null && this.getBean().getListaObraItemExigenciaTipoObra() != null) {
				for (ExigenciaTipoObra pa : exigencias) {
					for (ExigenciaTipoObra paCadastrado : this.getBean().getListaObraItemExigenciaTipoObra()) {
						if (pa.getId(). equals(paCadastrado.getId())) {
							checkMap.put(pa, new Boolean(true));
						}
					}
					if (checkMap.get(pa) == null ) {
						checkMap.put(pa, new Boolean(false));
					}
				}
			} else {
				for (ExigenciaTipoObra pa : exigencias) {
					checkMap.put(pa, new Boolean(false));
				}
			}
		}
		
		return getBean();
	}


	public List<SelectItem> getTabelaPrecos() {
		tabelaPrecos = new ArrayList<SelectItem>();
		List<TabelaPreco> lista = tabelaPrecoBC.findAll();
		for (TabelaPreco obj: lista) {
			tabelaPrecos.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return tabelaPrecos;
	}

	public void setTabelaPrecos(List<SelectItem> tabelaPrecos) {
		this.tabelaPrecos = tabelaPrecos;
	}

	public Long getTabelaPreco() {
		return tabelaPreco;
	}

	public void setTabelaPreco(Long tabelaPreco) {
		this.tabelaPreco = tabelaPreco;
	}

	public List<SelectItem> getLocalItems() {
		localItems = new ArrayList<SelectItem>();
		List<LocalItem> lista = localItemBC.findAll();
		for (LocalItem obj: lista) {
			localItems.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return localItems;
	}

	public void setLocalItems(List<SelectItem> localItems) {
		this.localItems = localItems;
	}

	public Long getLocalItem() {
		return localItem;
	}

	public void setLocalItem(Long localItem) {
		this.localItem = localItem;
	}


	public List<SelectItem> getAgrupamentoItems() {
		agrupamentoItems = new ArrayList<SelectItem>();
		List<AgrupamentoItem> lista = agrupamentoItemBC.findAll();
		for (AgrupamentoItem obj: lista) {
			agrupamentoItems.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return agrupamentoItems;
	}
	
	public void setAgrupamentoItems(List<SelectItem> agrupamentoItems) {
		this.agrupamentoItems = agrupamentoItems;
	}

	public Long getAgrupamentoItem() {
		return agrupamentoItem;
	}

	public void setAgrupamentoItem(Long agrupamentoItem) {
		this.agrupamentoItem = agrupamentoItem;
	}


	public List<SelectItem> getItemTabelaPrecos() {
		itemTabelaPrecos = new ArrayList<SelectItem>();
		if (this.getTabelaPreco() != null) {
			List<ItemTabelaPreco> lista = tabelaPrecoBC.load(this.getTabelaPreco()).getListaItemTabelaPrecos();
			for (ItemTabelaPreco obj: lista) {
				itemTabelaPrecos.add(new SelectItem(obj.getId(), obj.getDescricao() +  " - " + obj.getDescricao()));
			}
		}

		return itemTabelaPrecos;
	}

	public void setItemTabelaPrecos(List<SelectItem> itemTabelaPrecos) {
		this.itemTabelaPrecos = itemTabelaPrecos;
	}

	public Long getItemTabelaPreco() {
		return itemTabelaPreco;
	}

	public void setItemTabelaPreco(Long itemTabelaPreco) {
		this.itemTabelaPreco = itemTabelaPreco;
	}

	public void exportarCronograma(){
		System.out.print("t");
	}
	
	public void carregarExigencias() {
		System.out.print("e");
		this.getExigencias();
	}
	
	public void adicionarDocumento(){
		
	}
	public void removerDocumento(){
		
	}
	public void adicionarBDI(){
		
	}
	public void adicionarItens(){
		
	}

	public void removerItens(){
		
	}
	
	public Integer getPosicaoItem() {
		return posicaoItem;
	}

	public void setPosicaoItem(Integer posicaoItem) {
		this.posicaoItem = posicaoItem;
	}

	public BigDecimal getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(BigDecimal quantidade) {
		this.quantidade = quantidade;
	}

	public BigDecimal getValorTotalItens() {
		return valorTotalItens;
	}

	public void setValorTotalItens(BigDecimal valorTotalItens) {
		this.valorTotalItens = valorTotalItens;
	}

	public Integer getPeriodoInicialItem() {
		return periodoInicialItem;
	}

	public void setPeridoInicialItem(Integer periodoInicialItem) {
		this.periodoInicialItem = periodoInicialItem;
	}

	public Integer getPeriodoFinalItem() {
		return periodoFinalItem;
	}

	public void setPeridoFinalItem(Integer periodoFinalItem) {
		this.periodoFinalItem = periodoFinalItem;
	}

	public BigDecimal getBdiCadastro() {
		return bdiCadastro;
	}

	public void setBdiCadastro(BigDecimal bdiCadastro) {
		this.bdiCadastro = bdiCadastro;
	}

	public BigDecimal getBdi() {
		return bdi;
	}

	public void setBdi(BigDecimal bdi) {
		this.bdi = bdi;
	}

	public List<SelectItem> getBdis() {
		return bdis;
	}

	public void setBdis(List<SelectItem> bdis) {
		this.bdis = bdis;
	}

	public List<SelectItem> getPeriodos() {
		periodos = new ArrayList<SelectItem>();
		if (this.getBean() != null && this.getBean().getPrazoExecucao() != null) {
			for (int i = 0; i < this.getBean().getPrazoExecucao(); i++) {
				periodos.add(new SelectItem(i + "", i + ""));
			}
		}
		return periodos;
	}

	public void setPeriodos(List<SelectItem> periodos) {
		this.periodos = periodos;
	}

	public String getNomeArquivo() {
		return nomeArquivo;
	}

	public void setNomeArquivo(String nomeArquivo) {
		this.nomeArquivo = nomeArquivo;
	}

	public String getDescricaoArquivo() {
		return descricaoArquivo;
	}

	public void setDescricaoArquivo(String descricaoArquivo) {
		this.descricaoArquivo = descricaoArquivo;
	}

	public Integer getPosicaoDocumento() {
		return posicaoDocumento;
	}

	public void setPosicaoDocumento(Integer posicaoDocumento) {
		this.posicaoDocumento = posicaoDocumento;
	}

	public List<SelectItem> getUnidadeOrcamentarias() {
		unidadeOrcamentarias = new ArrayList<SelectItem>();
		List<UnidadeOrcamentaria> lista = unidadeOrcamentariaBC.findAll();
		for (UnidadeOrcamentaria obj: lista) {
			unidadeOrcamentarias.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return unidadeOrcamentarias;
	}

	public void setUnidadeOrcamentarias(List<SelectItem> unidadeOrcamentarias) {
		this.unidadeOrcamentarias = unidadeOrcamentarias;
	}

	public Long getUnidadeOrcamentaria() {
		if(unidadeOrcamentaria == null && this.getBean().getUnidadeOrcamentaria() != null) 
			unidadeOrcamentaria = this.getBean().getUnidadeOrcamentaria().getId();
		



		return unidadeOrcamentaria;
	}

	public void setUnidadeOrcamentaria(Long unidadeOrcamentaria) {
		this.unidadeOrcamentaria = unidadeOrcamentaria;
	}

	public Long getUnidadeExecutora() {
		if(unidadeExecutora == null && this.getBean().getUnidadeExecutora() != null) unidadeExecutora = this.getBean().getUnidadeExecutora().getId();
		return unidadeExecutora;
	}

	public void setUnidadeExecutora(Long unidadeExecutora) {
		this.unidadeExecutora = unidadeExecutora;
	}

	public List<SelectItem> getUnidadeMedidas() {
		unidadeMedidas = new ArrayList<SelectItem>();
		List<UnidadeMedida> lista = unidadeMedidaBC.findAll();
		for (UnidadeMedida obj: lista) {
			unidadeMedidas.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return unidadeMedidas;
	}

	public void setUnidadeMedidas(List<SelectItem> unidadeMedidas) {
		this.unidadeMedidas = unidadeMedidas;
	}

	public Long getUnidadeMedida() {
		if(unidadeMedida == null && this.getBean().getUnidadeMedida() != null)
			unidadeMedida = this.getBean().getUnidadeMedida().getId();

		return unidadeMedida;
	}

	public void setUnidadeMedida(Long unidadeMedida) {
		this.unidadeMedida = unidadeMedida;
	}

	public List<SelectItem> getTipoPrazos() {
		tipoPrazos = new ArrayList<SelectItem>();
		List<TipoPrazo> lista = tipoPrazoBC.findAll();
		for (TipoPrazo obj: lista) {
			tipoPrazos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return tipoPrazos;
	}

	public void setTipoPrazos(List<SelectItem> tipoPrazos) {
		this.tipoPrazos = tipoPrazos;
	}

	public Long getTipoPrazo() {
		if(tipoPrazo == null && this.getBean().getTipoPrazoObra() != null)
			tipoPrazo = this.getBean().getTipoPrazoObra() .getId();

		return tipoPrazo;
	}

	public void setTipoPrazo(Long tipoPrazo) {
		this.tipoPrazo = tipoPrazo;
	}

	public List<SelectItem> getProjetoAtividades() {
		projetoAtividades = new ArrayList<SelectItem>();
		List<ProjetoAtividade> lista = projetoAtividadeBC.findAll();
		for (ProjetoAtividade obj: lista) {
			projetoAtividades.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}

		return projetoAtividades;
	}

	public void setProjetoAtividades(List<SelectItem> projetoAtividades) {
		this.projetoAtividades = projetoAtividades;
	}

	public Long getProjetoAtividade() {

		if(projetoAtividade == null && this.getBean().getProjetoAtividade() != null)
			projetoAtividade = this.getBean().getProjetoAtividade().getId();


		return projetoAtividade;
	}

	public void setProjetoAtividade(Long projetoAtividade) {
		this.projetoAtividade = projetoAtividade;
	}

	public List<SelectItem> getDespesas() {
		despesas = new ArrayList<SelectItem>();
		List<Despesa> lista = despesaBC.findAll();
		for (Despesa obj: lista) {
			despesas.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}

		return despesas;
	}

	public void setDespesas(List<SelectItem> despesas) {
		this.despesas = despesas;
	}

	public Long getDespesa() {
		if(despesa == null && this.getBean().getDespesa() != null)
			despesa = this.getBean().getDespesa().getId();
		return despesa;
	}

	public void setDespesa(Long despesa) {
		this.despesa = despesa;
	}

	public List<SelectItem> getFormaExecucaos() {
		formaExecucaos = new ArrayList<SelectItem>();
		List<FormaExecucao> lista = formaExecucaoBC.findAll();
		for (FormaExecucao obj: lista) {
			formaExecucaos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return formaExecucaos;
	}

	public void setFormaExecucaos(List<SelectItem> formaExecucaos) {
		this.formaExecucaos = formaExecucaos;
	}

	public Long getFormaExecucao() {
		if(formaExecucao == null && this.getBean().getFormaExecucao() != null)
			formaExecucao = this.getBean().getFormaExecucao().getId();
		if(this.getSituacaoObra() != null)
			this.getBean().setSituacaoObra(this.situacaoObraBC.load(this.getSituacaoObra()));
		if(this.getTipoART() != null)
			this.getBean().setTipoArt(this.tipoARTBC.load(this.getTipoART()));

		return formaExecucao;
	}

	public void setFormaExecucao(Long formaExecucao) {
		this.formaExecucao = formaExecucao;
	}

	public List<SelectItem> getEstados() {
		estados = new ArrayList<SelectItem>();
		List<Estado> lista = estadoBC.findAll();
		for (Estado obj: lista) {
			estados.add(new SelectItem(obj.getUf(), obj.getDescricao()));
		}

		return estados;
	}

	public void setEstados(List<SelectItem> estados) {
		this.estados = estados;
	}

	public String getEstado() {
		if(estado == null && this.getBean().getUfEngenheiro() != null)
			estado = this.getBean().getUfEngenheiro().getUf();
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public List<SelectItem> getSituacaoObras() {
		situacaoObras = new ArrayList<SelectItem>();
		List<SituacaoObra> lista = situacaoObraBC.findAll();
		for (SituacaoObra obj: lista) {
			situacaoObras.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}

		return situacaoObras;
	}

	public void setSituacaoObras(List<SelectItem> situacaoObras) {
		this.situacaoObras = situacaoObras;
	}

	public Long getSituacaoObra() {

		if(situacaoObra == null && this.getBean().getSituacaoObra() != null)
			situacaoObra = this.getBean().getSituacaoObra().getId();

		return situacaoObra;
	}

	public void setSituacaoObra(Long situacaoObra) {
		this.situacaoObra = situacaoObra;
	}

	public List<SelectItem> getTipoARTs() {
		tipoARTs = new ArrayList<SelectItem>();
		List<TipoART> lista = tipoARTBC.findAll();
		for (TipoART obj: lista) {
			tipoARTs.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return tipoARTs;
	}

	public void setTipoARTs(List<SelectItem> tipoARTs) {
		this.tipoARTs = tipoARTs;
	}

	public Long getTipoART() {
		if(tipoART == null && this.getBean().getTipoArt() != null)
			tipoART = this.getBean().getTipoArt().getId();
		return tipoART;
	}

	public void setTipoART(Long tipoART) {
		this.tipoART = tipoART;
	}
}